/** 
 * @addtogroup hft
 * hft
 * @brief 控制子命令处理
 * 
 * 本文件接口提供了下线检测协议控制命令的解码接口以及应答消息的编码接口。
 * 
 * @code{c}
 * THftCmdCtrl g_ctrl_;
 * THftUserData g_user_data_;
 * 
 * // 继电器1控制
 * Int32 THftCmdCtrlRelay1(void *sender, THtpQueryAckBody *ack_body)
 * {
 *     Int32 result = 0;
 *      
 *     if (ack_body->param1)
 *          // 执行机构
 * 
 *     return reuslt;
 * }
 * 
 * // 继电器2控制
 * Int32 THftCmdCtrlRelay2(void *sender, THtpQueryAckBody *ack_body)
 * {
 *     Int32 result = 0;
 *      
 *     if (ack_body->param1)
 *          // 执行机构
 * 
 *     return reuslt;
 * }
 * 
 * // 控制功能列表
 * THftCmdCtrlServiceType service_tbl[] = 
 * {
 *     {kHtpCtrlRelay1,  &g_user_data_, THftCmdCtrlRelay1},
 *     {kHtpCtrlRelay2,  &g_user_data_, THftCmdCtrlRelay2},
 * }
 * 
 * // 创建查询功能
 * THftCmdCtrlCreate(&g_ctrl_, service_tbl, 2);
 * 
 * // 解析出控制消息
 * THtpMsg msg; // 假设此消息已经争取解析出来
 * HtpFrameDecode(src_buf, buf_len, &msg, &pop_size);
 * // ....
 * 
 * // 控制功能处理
 * Int32 result;
 * UInt8   dest_buf[1024];
 * result = THftCmdCtrlProc(&g_ctrl_, &msg, dest_buf, sizeof(dest_buf));
 * if (result > 0)
 *      // 发送成功应答
 * else
 *      // 处理失败应答
 * 
 * @endcode
 * 
 * @{
 *
 * @file         hft_cmd_control.h
 * @brief        控制子命令管理器
 * @note    
 * @author       lixinliang
 * @date         2020-08-23
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-08-23  <td>1.0                   <td>lixinliang      <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _HFT_CMD_CONTROL_H_
#define _HFT_CMD_CONTROL_H_

#include "ofc/ofc_types.h"
#include "ofc/ofc_object.h"
#include "hft/hft_proto.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 查询命令执行函数
 * @param sender: 用户对象 有些检测场景 需要用户的上下文
 * @param ack_body: 应答消息体 用户填充内容
 * @return 0:成功 -1:失败
 */
typedef Int32 (*THftCmdCtrlFunc)(void *sender, THtpCtrlAckBody *ack_body); 

/**
 * 控制服务数据项
 */
typedef struct THftCmdCtrlServiceTypeTag THftCmdCtrlServiceType;
struct THftCmdCtrlServiceTypeTag
{
    THtpCmdCtrlType  ctrl_id; ///< 控制ID
    void             *sender; ///< 用户自有属性
    THftCmdCtrlFunc  Method;  ///< 处理方法
};

typedef struct THftCmdCtrlTag THftCmdCtrl;
struct THftCmdCtrlTag
{
PRIVATE
    THftCmdCtrlServiceType *svr_table; ///< 服务列表
    UInt32                 table_size; ///< 列表长度
};

/**
 * 构造函数
 * @param self: 对象指针 
 * @return 
 */
Bool THftCmdCtrlCreate(THftCmdCtrl *self, THftCmdCtrlServiceType table[], UInt32 size);

/**
 * 查询是否支持自服务
 * @param self: 对象指针 
 * @param query_id: 查询服务ID 
 * @return >=0: 服务项索引 <0:不支持
 */
Int32 THftCmdCtrlSupportSubService(THftCmdCtrl *self, THtpCmdCtrlType ctrl_id);

/**
 * 命令处理函数
 * @param self: 对象指针
 * @param msg: 已知消息
 * @param dst_buf: 响应缓存
 * @param buf_size: 响应缓存长度
 * @return <0：执行失败返回码 >0:执行成功，响应的数据长度
 */
Int32 THftCmdCtrlProc(THftCmdCtrl *self, const THtpMsg *msg, Byte *dest_buf, Int32 buf_size);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void THftCmdCtrlDestroy(THftCmdCtrl *self);

#ifdef __cplusplus
}
#endif

#endif // _HFT_CMD_CONTROL_H_
/** @} */
